/**
 * @ Author:Yoann Meclot. MSay2
 * @ Created on:2020-08-28 11:42:33
 * @ Modified on: 2021-06-14 19:01:43
 *
 * @version 1.6
 */
/**
 * Copyright (c) 2020-2021 MSay2 (Yoann Meclot) - @msay2/tspoet
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { Modifier } from "./Modifier.js";
import { ObjectName } from "./ObjectName.js";
import { TSAnnotation } from "./TSAnnotation.js";
import { TSConstant } from "./TSConstant.js";
import { TSField } from "./TSField.js";
import { TSMethod } from "./TSMethod.js";
import { Kind } from "./TSPoet.js";
import { TSProperty } from "./TSProperty.js";
/**
 * TSType allows to you build a new element type.
 *
 * TSType can build Class, Interface and Enum.
 *
 * @class `TSType`
 * @version 1.6
 */
export declare class TSType
 {
    /**
     * Build Class.
     *
     * @param name The object class name.
     * @throws {TSPoetException} Check if the name is undefined or null.
     * @type {TSType.Builder}
     * @since 1.0
     */
    public static classBuilder(objectName:ObjectName):TSType.Builder;
    
    /**
     * Build anonymous implementation.
     *
     * @type {TSType.Builder}
     * @since 1.6
     */
    public static anonymousImplBuilder():TSType.Builder;
    
    /**
     * Build enumeration.
     *
     * @param objectName The object enumeration name.
     * @type {TSType.Builder}
     * @since 1.0
     */
    public static enumBuilder(objectName:ObjectName):TSType.Builder;
    
    /**
     * Build interface.
     *
     * @param objectName The object interface name.
     * @type {TSType.Builder}
     * @since 1.0
     */
    public static interfaceBuilder(objectName:ObjectName):TSType.Builder;

    public static Builder:{
        new (kind:Kind, name:ObjectName):{
            /**
             * Add a new documentation.
             *
             * @param arg Your documentation.
             * @throws {TSPoetException} Check if the arg is undefined or null.
             * @type {TSType.Builder}
             * @since 1.0
             */
            addDoc(arg:string):TSType.Builder;

            /**
             * Add a new annotation.
             *
             * @param annotation The annotation to be added.
             * @throws {TSPoetException} Check if the build initialized by TSType.anonymousBuilder static method.
             * @throws {TSPoetException} Check if the build initialized by TSType.enumBuilder static method.
             * @throws {TSPoetException} Check if the build initialized by TSType.interfaceBuilder static method.
             * @throws {TSPoetException} Check if the TSAnnotation object is undefined or null.
             * @type {TSType.Builder}
             * @since 1.0
             */
            addAnnotation(annotation:TSAnnotation):TSType.Builder;

            /**
             * Add modifiers.
             *
             * @param modifiers The modifiers to be added.
             * @throws {TSPoetException} Check if the build initialized by TSType.anonymousBuilder static method.
             * @throws {TSPoetException} Check if the modifiers is undefined or null.
             * @type {TSType.Builder}
             * @since 1.0
             */
            addModifiers(...modifiers:Modifier[]):TSType.Builder;

            /**
             * Add constant.
             *
             * @param tsConstant The constant to be added.
             * @throws {TSPoetException} Check if the build is not initialized by TSType.anonymousBuilder static method.
             * @throws {TSPoetException} Check if the build initialized by TSType.interfaceBuilder static method.
             * @type {TSType.Builder}
             * @since 1.0
             */
            addConstant(tsConstant:TSConstant):TSType.Builder;

            /**
             * Add comment.
             *
             * @param arg The comment to be added.
             * @throws {TSPoetException} Check if the arg is undefined or null.
             * @type {TSType.Builder}
             * @since 1.6
             */
            addComment(arg:string):TSType.Builder;

            /**
             * Add property.
             *
             * @param tsProperty The property to be added.
             * @throws {TSPoetException} Check if the build is not initialized by TSType.interfaceBuilder static method.
             * @throws {TSPoetException} Check if TSProperty object is undefined or null.
             * @type {TSType.Builder}
             * @since 1.0
             */
            addProperty(tsProperty:TSProperty):TSType.Builder;

            /**
             * Add generics names.
             *
             * @param names The generics names to be added.
             * @throws {TSPoetException} Check if the build initialized by TSType.anonymousBuilder static method.
             * @throws {TSPoetException} Check if the build initialized by TSType.enumBuilder static method.
             * @throws {TSPoetException} Check if names is undefined or null.
             * @type {TSType.Builder}
             * @since 1.6
             */
            addGenericNames(...names:string[]):TSType.Builder;

            /**
             * Set super class.
             *
             * @param superClass The super class type.
             * @throws {TSPoetException} Check if the build initialized by TSType.anonymousBuilder static method.
             * @throws {TSPoetException} Check if the build initialized by TSType.enumBuilder static method.
             * @throws {TSPoetException} Check if the super class object is undefined or null.
             * @type {TSType.Builder}
             * @since 1.0
             */
            setSuperclass(superClass:ObjectName):TSType.Builder;

            /**
             * Add interface implementation.
             *
             * @param impl The implementation to be added.
             * @throws {TSPoetException} Check if the build initialized by TSType.anonymousBuilder static method.
             * @throws {TSPoetException} Check if the build initialized by TSType.enumBuilder static method.
             * @throws {TSPoetException} Check if the build initialized by TSType.interfaceBuilder static method.
             * @throws {TSPoetException} Check if the impl object is undefined or null.
             * @type {TSType.Builder}
             * @since 1.0
             */
            addImplementation(impl:ObjectName):TSType.Builder;

            /**
             * Add field.
             *
             * @param field The field to be added.
             * @throws {TSPoetException} Check if the build initialized by TSType.enumBuilder static method.
             * @throws {TSPoetException} Check if the build initialized by TSType.interfaceBuilder static method.
             * @throws {TSPoetException} Check if the TSField object is undefined or null.
             * @type {TSType.Builder}
             * @since 1.0
             */
            addField(field:TSField):TSType.Builder;

            /**
             * Add method.
             *
             * @param method The method to be added.
             * @throws {TSPoetException} Check if the build initialized by TSType.enumBuilder static method.
             * @throws {TSPoetException} Check if the build initialized by TSType.interfaceBuilder static method.
             * @throws {TSPoetException} Check if the TSMethod object is undefined or null.
             * @type {TSType.Builder}
             * @since 1.0
             */
            addMethod(method:TSMethod):TSType.Builder;

            /**
             * Add nested class.
             *
             * @param clazz The class to be added.
             * @throws {TSPoetException} Check if the build initialized by TSType.anonymousBuilder static method.
             * @throws {TSPoetException} Check if the build initialized by TSType.enumBuilder static method.
             * @throws {TSPoetException} Check if the build initialized by TSType.interfaceBuilder static method.
             * @throws {TSPoetException} Check if the class object is undefined or null.
             * @type {TSType.Builder}
             * @since 1.6
             */
            addNestedClass(clazz:TSType):TSType.Builder;

            /**
             * Build object type.
             *
             * @type {TSType}
             * @since 1.0
             */
            build():TSType;
        };
    };
    
    private constructor(builder:TSType.Builder);
}
export declare namespace TSType
{
    type Builder = InstanceType<typeof TSType.Builder>;
}
//# sourceMappingURL=TSType.d.ts.map